

class ProgramBlock:
    def __init__(self, template_dir=""):

        self.dir = template_dir

        self.e_follow_line = """
    def e_follow_line(self, **kwargs):
        
        # 巡线事件，该事件每帧触发一次
        # 事件参数是一个引导线偏离图像中心点的偏移值，你可以使用以下语句获取该值
        # offset = kwargs['offset']
        # 你可以调用car_controller对象的follow_line函数，赋值偏移值，进行巡线。
        
        # 以下程序，演示了怎样利用偏离值进行小车巡线
        # 先获取偏离值
        # offset = kwargs['offset']
        # 当摄像头拍摄不到白线时，偏移值是-1000，这是通过程序对该值进行特殊处理
        # if offset == -1000:
        #     offset = self.p_offset * 1.6
        # else:
        #     self.p_offset = offset
        # 控制小车巡线
        # self.car_controller.follow_line(offset)

        print("e_flowing")

        """

        self.e_find_intersection = """
    def e_find_intersection(self, **kwargs):
        
        # 发现路口时触发本事件
        # 事件参数是返回当前路口的编号，以起点开始计算，第一个路口，该值为1，第二个路口，值为2，以此类推。
        
        # 你可以使用以下语句获取该值
        # number = kwargs['intersection_number']
        
        # 以下程序演示了怎样根据发现路口的信息，控制小车转弯
        # 获取当前的路口编号
        # number = kwargs['intersection_number']
        # 根据路口编号进行转弯动作
        # if number == 1:
        #     self.car_controller.turn(True, 1.2)
        # if number == 5:
        #     self.car_controller.turn(False, 1)

        print("e_find_intersection")    
        """

        self.e_find_roadblock = """
    def e_find_roadblock(self, **kwargs):
        # 当使用巡线摄像头发现障碍物时触发事件
        # 事件参数没有值
        
        # 以下程序演示了，检测到单一颜色障碍物时，进行避障动作
        # self.car_controller.bypass_obstacle(0.8, 2.7)
        print("e_find_roadblock")
     
        """

        self.e_find_zebra_crossing = """
    def e_find_zebra_crossing(self, **kwargs):
        
        # 发现斑马线时触发本事件
        # 事件参数没有值
        
        # 以下程序演示了发现斑马线时，小车在斑马线前暂停5秒
        # self.car_controller.stop(5)

        print("e_find_zebra_crossing")
        """

        self.e_object_detection = """
    def e_recognition(self, **kwargs):
        
        # 识别对象的事件，当程序发现一个以上可识别对象时，触发本事件
        # 事件参数是一个包括所有可识别对象Object（详见od目录下object.py）信息的列表
        # 你可以通过以下语句得到一个列表
        # object_list=kwargs['objects_list']
        # 你可以通过调用Recognition类的object_appeared函数检测判断可识别对象

        # 以下程序演示了怎样实现可识别对象的判断，并对小车进行控制。
        # 判断标签ID为1，宽度大于等于40的对象是否出现，如果出现，控制小车进行避障动作
        # 第三个参数10是表示如果对象出现，10秒内不重复检测
        # if self.recognition.object_appeared(1, 40, 10):
        #     self.car_controller.bypass_obstacle(0.8, 2.7)
        print("e_recognition")
        """
        self.lines = []

    def open_file(self):
        with open(self.dir, 'r', encoding='utf-8') as f:
            self.lines = f.readlines()

    def build_file(self, blocks, save_dir=""):
        self.open_file()
        if blocks:
            self.lines.insert(27, blocks)
            s = "".join(self.lines)
            with open(save_dir, "w", encoding='utf-8') as f:
                f.write(s)
